package com.liu.config;

import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2  // 开启 swagger2 的自动配置
public class SwaggerConfig {

    /**
     * 创建API应用
     * apiInfo() 增加API相关信息
     * 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现，
     * 本例采用指定扫描的包路径来定义指定要建立API的目录。
     *
     * @return
     */
    @Bean
    public Docket restApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                //.enable(false)        //配置是否启用Swagger，如果是false，在浏览器将无法访问
                //.groupName("标准接口")  // 访问加参数  /v2/api-docs?group=标准接口
                .apiInfo(apiInfo())
                //.useDefaultResponseMessages(true)
                //.forCodeGeneration(false)

                /*
                 通过.select()方法，去配置扫描接口,
                 配置如何扫描接口
                 RequestHandlerSelectors
                    .any()      // 扫描全部的接口，默认
                    .none()     // 全部不扫描
                    .basePackage("com.duojiala.mikeboot.controller")    // 扫描指定包下的接口，最为常用
                    .withClassAnnotation(RestController.class)          // 扫描带有指定注解的类下所有接口
                    .withMethodAnnotation(PostMapping.class)            // 扫描带有只当注解的方法接口

                PathSelectors
                    .any()           // 满足条件的路径，该断言总为true
                    .none()          // 不满足条件的路径，该断言总为false（可用于生成环境屏蔽 swagger）
                    .ant("/user/**") // 满足字符串表达式路径
                    .regex("")       // 符合正则的路径
                 */
                .select()
                // 配置如何扫描接口
                .apis(RequestHandlerSelectors.basePackage("com.liu.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * 创建该API的基本信息（这些基本信息会展现在文档页面中）
     * 访问地址：http://ip:port/swagger-ui.html
     *
     * @return
     */
    private ApiInfo apiInfo() {
        //联系人
        Contact contact = new Contact("lzq", "https://blog.csdn.net/xqnode", "xiaqingweb@163.com");
        return new ApiInfoBuilder()
                .title("Spring Boot中使用Swagger2构建RESTful APIs")      // 标题
                .description("更多请关注: https://blog.csdn.net/xqnode") //描述
                .termsOfServiceUrl("https://blog.csdn.net/xqnode")       // 组织链接
                .contact(contact)
                .version("1.0")                                         //版本
                .build();
    }
}
